package com.struts.chain.invocation.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.struts.chain.action.TestAction;
import com.struts.chain.interceptor.Interceptor;
import com.struts.chain.interceptor.impl.Test01InterceptorImpl;
import com.struts.chain.interceptor.impl.Test02InterceptorImpl;
import com.struts.chain.interceptor.impl.Test03InterceptorImpl;
import com.struts.chain.invocation.ActionInvocation;

/**
 * 责任链模式案例：
 * 		模拟Struts2核心invoke()方法实现机制
 * @author LC
 *
 */
public class DefaultActionInvocation implements ActionInvocation{
	
	/**
	 * 声明所有拦截器的迭代器形式
	 */
	private Iterator<Interceptor> interceptors ;
	private String resultCode = null ;
	
	public DefaultActionInvocation() {
		/**
		 * 初始化拦截器
		 */
		init() ;
	}

	private void init() {
		/**
		 * 创建一个拦截器集合
		 */
		List<Interceptor> inter = new ArrayList<Interceptor>() ;
		/**
		 * 创建三个具体的拦截器
		 */
		Test01InterceptorImpl interceptor01 = new Test01InterceptorImpl() ;
		Test02InterceptorImpl interceptor02 = new Test02InterceptorImpl() ;
		Test03InterceptorImpl interceptor03 = new Test03InterceptorImpl() ;
		
		inter.add(interceptor01) ;
		inter.add(interceptor02) ;
		inter.add(interceptor03) ;
		
		this.interceptors = inter.iterator() ;
	}

	public String invoke() {
		if(interceptors.hasNext()) { //跌打执行所有的拦截器
			/**
			 * 如果有,先返回下一个拦截器
			 */
			Interceptor interceptor = interceptors.next() ;
			/**
			 * 调用拦截器的intercept方法
			 * 		1、执行intercept方法的方法体，
			 * 		2、在intercept方法的方法体执行invocation.invoke()方法
			 * 		3、调用invoke()方法，进行下一次拦截器迭代执行
			 * 		4、...循环往复，直到迭代完所有的拦截器元素
			 */
			resultCode = interceptor.intercept(DefaultActionInvocation.this) ;
		} else {	//执行完所有的拦截器后，执行目标动作方法
			resultCode = executeAction() ;
		}
		return resultCode;	
	}
	
	private String executeAction() {
		return new TestAction().execute();
	}

}
